package cron

import (
	"common/model"
	"fmt"
	"github.com/robfig/cron/v3"
	"go.uber.org/zap"
	"product_server/dao/dao_redis"
	"time"
)

// 订单超时自动取消
func OrderUpdatePaidTime(sn string) {
	fmt.Printf("订单 %s 超时检查定时任务开始\n", sn)
	fmt.Println(time.Now().Format(time.DateTime))

	c := cron.New(cron.WithSeconds())

	// 5分钟后执行一次检查
	c.AddFunc("@every 2m", func() {
		fmt.Printf("检查订单 %s 是否超时未支付\n", sn)

		//根据订单号查询订单状态
		info, err := model.GetOrderIdInfo(sn)
		if err != nil {
			zap.L().Info("订单超时检查,查询订单状态失败", zap.String("order_sn", sn), zap.Error(err))
			c.Stop()
			return
		}

		fmt.Printf("订单 %s 当前状态: %d\n", sn, info.Status)

		switch info.Status {
		case 1: // 已支付成功
			fmt.Printf("订单 %s 已支付成功，定时任务结束\n", sn)
			c.Stop()

		case 2, 3: // 未支付或待支付，超时取消
			// 检查是否为秒杀订单，需要回滚库存
			if info.OrderType == 4 { // 秒杀订单
				// 查询秒杀订单详情
				seckillOrder, err := model.GetSeckillOrderByOrderId(info.Id)
				if err != nil {
					zap.L().Error("查询秒杀订单详情失败", zap.String("order_sn", sn), zap.Error(err))
				} else {
					// 回滚Redis库存
					if err := dao_redis.RestoreSeckillStock(seckillOrder.ActivityId); err != nil {
						zap.L().Error("回滚Redis秒杀库存失败", zap.String("order_sn", sn), zap.Int64("activity_id", seckillOrder.ActivityId), zap.Error(err))
					} else {
						fmt.Printf("订单 %s 超时取消，已回滚Redis秒杀库存\n", sn)
					}
				}
			}

			// 取消订单
			err := model.OrderUpdatePaid(sn, 4) // 修改为已取消状态
			if err != nil {
				zap.L().Info("订单超时取消失败", zap.String("order_sn", sn), zap.Error(err))
				return
			}
			fmt.Printf("订单 %s 超时未支付，已自动取消\n", sn)
			c.Stop()

		case 4: // 已取消
			fmt.Printf("订单 %s 已取消，定时任务结束\n", sn)
			c.Stop()

		default:
			fmt.Printf("订单 %s 状态异常: %d，定时任务结束\n", sn, info.Status)
			c.Stop()
		}

		fmt.Println("订单超时检查结束")
		fmt.Println(time.Now().Format(time.DateTime))
	})

	c.Start()

	// 6分钟后强制停止定时任务（防止意外情况下任务一直运行）
	go func() {
		time.Sleep(6 * time.Minute)
		c.Stop()
		fmt.Printf("订单 %s 定时任务强制停止\n", sn)
	}()
}
